package com.proyecto.core.vista.echo.componentes;

import java.util.ArrayList;
import java.util.ResourceBundle;
import nextapp.echo2.app.ApplicationInstance;
import nextapp.echo2.app.Component;
import nextapp.echo2.app.ContentPane;
import nextapp.echo2.app.RadioButton;
import nextapp.echo2.app.button.ButtonGroup;

import com.proyecto.core.Utilidades.UtilReflect;
import com.proyecto.core.modelo.excepciones.GeneralException;
import com.proyecto.core.vista.echo.interfaces.ICPAreaDatos;
import com.proyecto.core.vista.echo.localizador.ServiceLocator;

import echopointng.table.SortableTableModel;


@SuppressWarnings("serial")
public class CPAreaDatos extends ContentPane implements ICPAreaDatos{

	protected ResourceBundle resourceBundle;
	protected ServiceLocator serviceLocator ;
	protected ResourceBundle mensajeError;
	protected ContentPane    cpPrincipal = ApplicationInstance.getActive().getDefaultWindow().getContent();
	protected WPTransaccion  wpTransaccion;
	
	protected Integer areaDatosAncho  = 400;
	protected Integer areaDatosAlto   = 110;
	
	protected Integer areaListaAlto   = 290;
	protected Integer areaListaAncho  = 300;
	
	protected boolean modoNuevo    = false;
	protected boolean modoEdicion  = false;
	protected boolean muestraTabla = true;
	protected boolean activaBusquedaInicial = true;
	protected boolean muestraMensConsultaVacia = false;
	
	//propiedades para configurar la lista de la tabla
	protected ArrayList<String> tablaTitulos = new ArrayList<String>();
	protected ArrayList<String> tablaCampos  = new ArrayList<String>();
	protected String            tituloVentana   = "Tabla de Mantenimiento";
    
	protected String   servicioNombre = "";
	protected String[] busquedaAtributos;
	protected Object[] busquedaValores;
	
	protected ArrayList<BindingCampo> ListaBinding = new ArrayList<BindingCampo>();

	private   boolean esPortada        = false;
	protected boolean esObjetoDTOLista = false;
	protected Object objetoDTO;
	protected Object objetoDTONuevo;
	protected Object objetoDTOPadre;
	protected Component Campofoco=null;
	public int directivaOrdenamiento = SortableTableModel.ASCENDING;//Orden ascendente o descendente de una columna en la tabla.
	
	/**
	 * Variable usada cuando se desde el contentpane hijo cuando se desee realizar o no la busqueda.
	 */
	protected boolean realizarBusqueda = true;

	/**
	 * Creates a new <code>CPAreaDatos</code>.
	 */
	public CPAreaDatos() {
		super();
		// Add design-time configured components.
		initComponents();
	}
	
	/**
	 * Este metodo <code>inicializar</code> debe ser invocado por
	 * la clase que instancia CPAreaDatos 
	 */
	public void inicializar(){
		ordenTabulacion();
	}
	
	public void colocarFoco(Component componente){
		ApplicationInstance.getActive().setFocusedComponent(componente);
	}
	
	protected void ordenTabulacion(){
	}
	
	public boolean configurarTabla(){
		tablaTitulos.clear();
		tablaCampos.clear();
		return muestraTabla;
	}
	
	public Boolean configurarBusqueda(){
		return false;
	}
	
	protected void configurarBinding(){
		ListaBinding.clear();
	}

	protected void ObjetoDTOValoresControl(Object pObjeto){
		try {
			// SegUsuarios usuario = ((Aplicacion) ApplicationInstance.getActive()).getSegUsuarios(); 
			// ((Personas) objetoDTO).getId().setCiaopr(usuario.getId().getCiaopr());
			//TODO; ciaOpr asignarlo con un valor dinamico, no todos tienen el ciaOpr aki, cuando se modifica no deberia ir esto.-
			UtilReflect.invocarMetodoSet(objetoDTO, "id.ciaopr", new Class[] {String.class},"1");
		} catch (Exception e) {
			// TODO: handle exception
			System.err.println("Aviso al programador:...debe sobreescribir el metodo ObjetoDTOValoresControl " +
					           "sin super.ObjetoDTOValoresControl, en el CP que hereda de CPAreaDatos, para asignar valores de ciaopr" );
//			e.printStackTrace();
		}
	}

	/**
	 * Sincroniza los valores del objetoDTOPadre al objetoDTONuevo
	 */
	protected void sincronizarDTOPadreaNuevo(){
		
	}

	public void rutinaDeshabilitar() {
		modoEdicion = false;
		for (int posic = 0; posic < ListaBinding.size(); posic++) {
			ListaBinding.get(posic).BindingCampoHabilitar(false);
		}
	}

	public void rutinaHabilitar(Boolean pModoNuevo) {
		modoEdicion = true;
		for (int posic = 0; posic < ListaBinding.size(); posic++) {
			ListaBinding.get(posic).BindingCampoHabilitar(true);
		}
	}

	public void rutinaLimpiar(){
		for (int posic = 0; posic < ListaBinding.size(); posic++) {
			ListaBinding.get(posic).mostrarValor(new String(""));
			//System.out.println(ListaBinding.get(posic).getCampo());
		}
	}

	public void rutinaAccionIncluir() {
		modoNuevo = true;
		setObjetoDTO(objetoDTONuevo, true);
		rutinaLimpiar();
		Campofoco = null;
		for (int posic = 0; posic < ListaBinding.size(); posic++) {
			ListaBinding.get(posic).BindingGet();
			setFocoTabs(ListaBinding.get(posic));
		}
		colocarFoco(Campofoco);
	}
	
	
	
	 
	public void rutinaAccionModificar() {
		modoNuevo = false;
		Campofoco=null;
		for (int posic = 0; posic < ListaBinding.size(); posic++) {
			if (ListaBinding.get(posic).getNoAceptaModoModif()) {
				ListaBinding.get(posic).BindingCampoHabilitar(false);
			}
			setFocoTabs(ListaBinding.get(posic));
		}
		colocarFoco(Campofoco);
	}
	
	public void rutinaAccionMostrar() {
		
		for (int posic = 0; posic < ListaBinding.size(); posic++) {
			ListaBinding.get(posic).BindingGet();
		}
	}

	
	
	public void rutinaAccionIteracionTabla() {
		// TODO Auto-generated method stub
		
	}

	public boolean rutinaAccionSalir(){
		System.out.println("CpAreaDatos.rutinaAccionSalir");
		return true;
	}
	
	public boolean rutinaAccionEliminarPre() {
		return true;
	}	

	public boolean rutinaAccionEliminarPost() {
		return true;
	}	

	public boolean rutinaAccionSalirPost() {
		// TODO Auto-generated method stub
		return true;
	}

	public boolean rutinaAccionSalirPre() {
		// TODO Auto-generated method stub
		return true;
	}

	public void rutinaAccionConsultar() {
		
	}
	
	public boolean rutinaAccionAceptarPre() throws GeneralException {
		if (modoNuevo) {
			ObjetoDTOValoresControl(objetoDTO);
		}

		for (int posic = 0; posic < ListaBinding.size(); posic++) {
			if ((!ListaBinding.get(posic).getNoAceptaModoModif()) || 
				((ListaBinding.get(posic).getNoAceptaModoModif()) && modoNuevo)){
					ListaBinding.get(posic).BindingSet();
			}
		}

		return true;
	}

	public boolean rutinaAccionAceptarPost() {
		return true;
	}
	
	public void rutinaAccionCancelar() {

	}
	
	public void rutinaAccionCursor() {
		if (modoNuevo) {
			rutinaCursorModoNuevo();
		} else {
			rutinaCursorModoModificar();
		}
	}

	protected void rutinaCursorModoNuevo() {
	}

	protected void rutinaCursorModoModificar() {
	}

	/**
	 * @return the servicioNombre de tipo String
	 */
	final public String getServicioNombre() {
		return servicioNombre;
	}

	/**
	 * @param servicioNombre the servicioNombre to set
	 */
	final public void setServicioNombre(String servicioNombre) {
		this.servicioNombre = servicioNombre;
	}

	/**
	 * <code>getBusquedaCampos</code> retorna los campos utilzados en el servicio para la busqueda por propiedad, este metodo es invocado 
	 * cuando el CPAreaDatos no utiliza el areaLista. 
	 */
	public String[] getBusquedaAtributos() {
		return busquedaAtributos;
	}

	/**
	 * Este metodo <code>getBusquedaValores</code> retorna los valores utilzados en el servicio para la busqueda por propiedad, este metodo es invocado 
	 * cuando el CPAreaDatos no utiliza el areaLista.
	 */
	public Object[] getBusquedaValores() {
		return busquedaValores;
	}
	
	/**
	 * @return the esObjetoDTOLista
	 */
	public boolean isEsObjetoDTOLista() {
		return esObjetoDTOLista;
	}

	/**
	 * @param esObjetoDTOLista the esObjetoDTOLista to set
	 */
	public void setEsObjetoDTOLista(boolean esObjetoDTOLista) {
		this.esObjetoDTOLista = esObjetoDTOLista;
	}

	public Object getObjetoDTO() {
		return objetoDTO;
	}

//	final public void setObjetoDTO(Object pObjetoDTO) {
//		objetoDTO = pObjetoDTO;
//		try {
//			ObjetoDTOValoresControl(objetoDTO);
//		} catch (Exception e) {
//			// TODO: handle exception
//			e.printStackTrace();
//		}
//		
//	}

	public void setObjetoDTO(Object pObjetoDTO, boolean pEsBinding) {
		objetoDTO = pObjetoDTO;
		try {
			//UtilReflect.invocarMetodoSet(objetoDTO, "id", "ciaopr", new Class[] {String.class},"1");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		if (pEsBinding) {
			configurarBinding();
		}
	}
	
//	final public Object getObjetoDTONuevo() {
//		return objetoDTONuevo;
//	}

	public void setObjetoDTONuevo(Object pObjetoDTONuevo) {
		objetoDTONuevo = pObjetoDTONuevo;
		if (objetoDTOPadre != null)
			sincronizarDTOPadreaNuevo();
		setObjetoDTO(objetoDTONuevo, true); //TODO verificar porw esto se repite en rutinaAccionIncluir
	}

	public void setObjetoDTOPadre(Object pObjetoDTOPadre) {
		objetoDTOPadre = pObjetoDTOPadre;
		if (objetoDTOPadre != null)
			sincronizarDTOPadreaNuevo();
	}
	
	/**
	 * Situa el foco en el primer elemento habilitado que consiga, quita la participaci�n 
	 * para el tabsIndex cuando el elemento est� deshabilitado y lo coloca en caso contrario
	 * retorna el componente al cual se le asignara el foco.
	 * */
	public Component setFocoTabs(BindingCampo bindingCampo){
		Object objeto = bindingCampo.getCampo();
		Component componente = null;
		if((objeto instanceof Component)){
			componente = (Component) objeto;
			if(!componente.isEnabled()){
				componente.setFocusTraversalParticipant(false);//Aca hice mi modificacion..
			}else{
				componente.setFocusTraversalParticipant(true);
				if(Campofoco==null){
					Campofoco=componente;
				}
			}
		}else if(objeto instanceof ButtonGroup){
			ButtonGroup buttonGroup = (ButtonGroup)objeto;
			RadioButton[] botones = buttonGroup.getButtons();
			for (int i =0 ; i< botones.length; i++){
				componente = botones[i];
				if(!componente.isEnabled()){
					componente.setFocusTraversalParticipant(false);
				}else{
					componente.setFocusTraversalParticipant(true);
				}
			}
		}
		return Campofoco;
	}
	
	/**
	 * Metodo que se ejecuta al Mostrar el WPTrasancion que contiene el CP.
	 */
	public void rutinaAccionMostrarVentana(){
		
	}
	
	public ArrayList<String> getTablaTitulos() {
		return tablaTitulos;
	}
	
	public ArrayList<String> getTablaCampos() {
		return tablaCampos;
	}

	public String getTituloVentana() {
		return tituloVentana;
	}

	public void setTituloVentana(String tituloVentana) {
		this.tituloVentana = tituloVentana;
	}
	
	public String getTituloVentanaExpediente() {
		return "";
	}
	
	public boolean getMuestraTabla() {
		return muestraTabla;
	}

	public void setMuestraTabla(boolean muestraTabla) {
		this.muestraTabla = muestraTabla;
	}

	public boolean isActivaBusquedaInicial() {
		return activaBusquedaInicial;
	}

	protected void setActivaBusquedaInicial(boolean activaBusquedaInicial) {
		this.activaBusquedaInicial = activaBusquedaInicial;
	}

	public boolean isMuestraMensConsultaVacia() {
		return muestraMensConsultaVacia;
	}

	protected void setMuestraMensConsultaVacia(boolean muestraMensConsultaVacia) {
		this.muestraMensConsultaVacia = muestraMensConsultaVacia;
	}

	public boolean isEsPortada() {
		return esPortada;
	}

	public void setEsPortada(boolean esPortada) {
		this.esPortada = esPortada;
	}

	/**
	 * @return el alto del ContentPane
	 */
	public Integer getAreaDatosAncho() {
		return areaDatosAncho;
	}

	/**
	 * @param areaDatosAncho el ancho del ContentPane. Valor minimo configurable 400
	 */
	final protected void setAreaDatosAncho(Integer areaDatosAncho) {
		this.areaDatosAncho = areaDatosAncho;
	}
	
	/**
	 * @return el alto del ContentPane
	 */
	public Integer getAreaDatosAlto() {
		return areaDatosAlto;
	}

	/**
	 * @param areaDatosAlto el alto del ContentPane.Valor minimo configurable 110
	 */
	final protected void setAreaDatosAlto(Integer areaDatosAlto) {
		this.areaDatosAlto = areaDatosAlto;
	}

	/**
	 * @return el alto del ContentPane
	 */
	public Integer getAreaListaAlto() {
		return areaListaAlto;
	}

	/**
	 * @param tamanoAlto el alto del ContentPane
	 */
	final protected void setAreaListaAlto(Integer areaListaAlto) {
		this.areaListaAlto = areaListaAlto;
	}
	
	
	/**
	 * @return the cpPrincipal
	 */
	public ContentPane getCpPrincipal() {
		return cpPrincipal;
	}

	
	/**
	 * @return the wpTransaccion
	 */
	protected WPTransaccion getWpTransaccion() {
		return wpTransaccion;
	}

	/**
	 * @param wpTransaccion the wpTransaccion to set
	 */
	public void setWpTransaccion(WPTransaccion wpTransaccion) {
		this.wpTransaccion = wpTransaccion;
	}

	/**
	 * @return the serviceLocator
	 */
	public ServiceLocator getServiceLocator() {
		return serviceLocator;
	}

	/**
	 * @param serviceLocator the serviceLocator to set
	 */
	public void setServiceLocator(ServiceLocator serviceLocator) {
		this.serviceLocator = serviceLocator;
	}

	/**
	 * @return the mensajeError
	 */
	public ResourceBundle getMensajeError() {
		return mensajeError;
	}

	/**
	 * @param mensajeError the mensajeError to set
	 */
	public void setMensajeError(ResourceBundle mensajeError) {
		this.mensajeError = mensajeError;
	}

	/**
	 * Configures initial state of component.
	 * WARNING: AUTO-GENERATED METHOD.
	 * Contents will be overwritten.
	 */
	private void initComponents() {
		
	}

	public int getDirectivaOrdenamiento() {
		return directivaOrdenamiento;
	}

	/**
	 * Este metodo se deja para ser sobreescrito, si fuera necesario modificar 
	 * la configuracion por defecto para cada accion del estandart.
	 */
	public void configurarBotones(int pAccion) {
	}

	public boolean puedeRealizarBusqueda() {
		return realizarBusqueda;
	}

	public void inicializarPost() {
		
	}

	public Integer getAreaListaAncho() {
		return areaListaAncho;
	}

	public void setAreaListaAncho(Integer areaListaAncho) {
		this.areaListaAncho = areaListaAncho;
	}

	public boolean isModoNuevo() {
		return modoNuevo;
	}

	public void setModoNuevo(boolean modoNuevo) {
		this.modoNuevo = modoNuevo;
	}

	public boolean getModoNuevo() {
		return modoNuevo;
	}
	
}
